package com.objcat.playground.leetcode;

import java.util.ArrayList;

/**
 * description: Solution22 <br>
 * date: 2022/3/15 12:30 PM <br>
 * author: objcat <br>
 * version: 1.0 <br>
 */
public class Solution22 {
    /**
     * description: 连接排序法 <br>
     * version: 1.0 <br>
     * date: 2022/3/15 1:41 PM <br>
     * author: objcat <br>
     * @param list1 链表1
     * @param list2 链表2
     * @return 链表1
     * 执行用时：9 ms, 在所有 Java 提交中击败了 100.00% 的用户
     * 内存消耗：41.1 MB, 在所有 Java 提交中击败了 6.71% 的用户
     */
    public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
        // 判断边界
        if (list1 != null && list2 != null) {
            // 计算两个链表的数量
            int count1 = this.count(list1);
            int count2 = this.count(list2);
            // 取链表1最后一个元素
            ListNode list1End = this.index(list1, count1 - 1);
            // 连起来
            list1End.next = list2;
            // 计算两个两遍合起来的长度
            int count12 = count1 + count2;
            // 排序
            for (int i = 0; i < count12 - 1; i++) {
                for (int j = i; j < count12 - 1; j++) {
                    ListNode node_a = this.index(list1, i);
                    ListNode node_b = this.index(list1, j + 1);
                    if (node_a.val > node_b.val) {
                        int temp = node_b.val;
                        node_b.val = node_a.val;
                        node_a.val = temp;
                    }
                }
            }
            return list1;
        } else if (list1 != null) {
            return list1;
        } else {
            return list2;
        }
    }

    public ListNode index(ListNode head, int index) {
        for (int i = 0; i < index; i++) {
            head = head.next;
        }
        return head;
    }

    public int count(ListNode head) {
        int count = 0;
        while (true) {
            count++;
            if (head.next == null) {
                break;
            }
            head = head.next;
        }
        return count;
    }


    public static void main(String[] args) {
        ArrayList<Integer> list1 = new ArrayList<>();
        list1.add(1);
        list1.add(2);
        list1.add(3);
        list1.add(4);

        ArrayList<Integer> list2 = new ArrayList<>();
        list2.add(1);
        list2.add(2);
        list2.add(3);
        list2.add(4);

        ListNode node1 = ListNode.createNode(list1);
        ListNode node2 = ListNode.createNode(list2);
        Solution22 solution22 = new Solution22();
        ListNode result = solution22.mergeTwoLists(node1, node2);
        System.out.println(result);
    }
}
